/*
 * @Author: Fan Dong
 * @Date: 2021-07-09 11:10:13
 * @LastEditors: Fan Dong
 * @LastEditTime: 2021-07-09 11:13:15
 * @Description: 文件描述
 * @FilePath: \learn-typescript\ts\modules\Animal.ts
 */
/*
 * @Author: Fan Dong
 * @Date: 2021-07-09 10:40:55
 * @LastEditors: Fan Dong
 * @LastEditTime: 2021-07-09 10:55:28
 * @Description: 文件描述
 * @FilePath: \learn-typescript\ts\9.命名空间.ts
 */

/* 命名空间：
      在代码量较大的情况下，为了避免各种命名冲突，可将相似功能的函数，类，接口等放置到命名空间内
      同JAVA的包，NET的命名空间一样，ts的命名空间可以江代码包裹起来，只对外暴露需要的外部访问的对象，命名空间内的对象通过export

  命名空间和模块的区别：

      命名空间：内部模块，主要用于组织代码，避免命名冲突。
      模块：ts的外部模块的简称，侧重代码的复用，一个模块里可能会有多个命名空间
*/

export namespace A {
  interface Animal {
    name: string;
    eat(): void;
  }

  export class Dog implements Animal {
    name: string;
    constructor(name: string) {
      this.name = name;
    }
    eat() {
      console.log(this.name + "吃狗粮");
    }
  }

  export class Cat implements Animal {
    name: string;
    constructor(theName: string) {
      this.name = theName;
    }
    eat() {
      console.log(this.name + "吃猫粮");
    }
  }

  // let dog = new Dog('狗狗');
  // dog.eat();
}


export namespace B {
  interface Animal {
    name: string;
    eat(): void;
  }

  export class Dog implements Animal {
    name: string;
    constructor(name: string) {
      this.name = name;
    }
    eat() {
      console.log(this.name + "吃狗粮");
    }
  }

  export class Cat implements Animal {
    name: string;
    constructor(theName: string) {
      this.name = theName;
    }
    eat() {
      console.log(this.name + "吃猫粮");
    }
  }

  // let dog = new Dog('狗狗');
  // dog.eat();
}

// let d1 = new A.Dog('狼狗')
// d1.eat();